package service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import util.UtilData;
import dao.PessoaDAO;
import entity.Pessoa;
import entity.PessoaFisica;
import entity.PessoaJuridica;
import entity.Produto;
import enumeration.PessoaEnum;
import enumeration.TipoPessoaEnum;

@Service
public class PessoaServiceImpl extends BaseService implements PessoaService, Serializable {

	private static final long serialVersionUID = -8754416176752850943L;
	
	@Autowired
	private PessoaDAO pessoaDAO;
	
	/**
	 * @see service.PessoaService#salvarPessoa(entity.Pessoa)
	 */
	@Override
	@Transactional
	public void salvarPessoa(Pessoa pessoa) {
		if(pessoa.getId() == null){
			pessoa.setDataInclusao(UtilData.getDataAtual());
			pessoa.setAtivo(true);
			pessoaDAO.salvar(pessoa);
		}else{
			pessoa.setDataAlteracao(UtilData.getDataAtual());
			pessoaDAO.merge(pessoa);
		}
	}

	/**
	 * @see service.PessoaService#listarTodosPessoa()
	 */
	@Override
	public List<Pessoa> listarTodosPessoas() {
		return pessoaDAO.buscarTodos();
	}


	/**
	 * @see service.PessoaService#remover(entity.Pessoa)
	 */
	@Override
	@Transactional
	public void remover(Pessoa pessoa) {
		pessoaDAO.remover(pessoa);
	}

	
	/**
	 * @see service.PessoaService#desativar(entity.Pessoa)
	 */
	@Override
	@Transactional
	public void desativar(Pessoa pessoa) {
		pessoa.setAtivo(false);
		salvarPessoa(pessoa);

	}

	/**
	 * @see service.PessoaService#criarNovoPessoa(enumeration.PessoaEnum)
	 */
	@Override
	public Pessoa criarNovoPessoa(PessoaEnum pessoaEnum) {
		Pessoa pessoa = null;
		if (pessoaEnum == PessoaEnum.FISICA) {
			pessoa = new PessoaFisica();
			pessoa.setPessoa(PessoaEnum.FISICA);
		} else if (pessoaEnum == PessoaEnum.JURIDICA) {
			pessoa = new PessoaJuridica();
			pessoa.setPessoa(PessoaEnum.JURIDICA);
		}else {
			pessoa = new PessoaFisica();
			pessoa.setPessoa(PessoaEnum.FISICA);
		}
		pessoa.setListaTipoPessoa(new ArrayList<TipoPessoaEnum>());
		return pessoa;
	}

	/**
	 * @see service.PessoaService#buscarPessoaPorChave(java.lang.Long)
	 */
	@Override
	public Pessoa buscarPessoaPorChave(Long id) {
		return pessoaDAO.buscarPorChave(id);
	}
	
	@Override
	public List<Pessoa> buscarPessoaPorNome(String nome) {
		Pessoa pessoa = new Pessoa();
		pessoa.setAtivo(true);
		pessoa.setNome("%"+nome+"%");
		return pessoaDAO.buscarPorExemplo(pessoa);
	}

	/**
	 * @see service.PessoaService#listarPessoasAtivos()
	 */
	@Override
	public List<Pessoa> listarPessoasAtivos() {
		return pessoaDAO.listarPessoaAtivos();
	}


	/**
	 * @see service.PessoaService#listarPessoasPorExemplo()
	 */
	@Override
	public List<Pessoa> listarPessoasPorExemplo(Pessoa pessoa) {
		return pessoaDAO.buscarPorExemplo(pessoa, Order.asc("nome"));
	}
	
	
	/**
	 * @see service.PessoaService#criarNovaListaPessoa()
	 */
	@Override
	public List<Pessoa> criarNovaListaPessoa() {
		return new ArrayList<Pessoa>();
	}

}
